package com.bigdata;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bigdata.pojo.AppStart;
import com.bigdata.utils.GenerateFieldsDataUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Random;

/**
 * @className: AppMain
 * @description: TODO 生成用户访问行为数据 包含：启动日志，事件日志
 */
public class AppMain {

    private final static Logger logger = LoggerFactory.getLogger(AppMain.class);
    private static Random rand = new Random();
    /**
     * 生成模拟用户访问行为日志数据
     * @param delay     控制发送每条日志延迟时间，默认是0s
     * @param loop_len  生成的日志条数，默认1000
     */
    private static void generateLog(Long delay, int loop_len) {

        for (int i = 0; i < loop_len; i++) {
            int flag = rand.nextInt(2); // 0 1
            switch (flag) {
                /**
                 * 生成启动日志数据：
                 */
                case (0):
                    //封装启动日志字段数据：22个（15个公共字段 + 7个启动日志字段）
                    AppStart appStart = GenerateFieldsDataUtil.generateStart();
                    //将对象转化成JSON字符串：
                    String jsonString = JSON.toJSONString(appStart);
                    /**
                     * 1. 控制台打印
                     */
                    logger.info(jsonString);
                    /**
                     * 2. 请求发送到指定webserver:
                     */
                    //RequestProcess.sendLogByAsynchronousRequest(jsonString);
                    break;

                /**
                 * 生成事件日志数据：
                 */
                case (1):

                    JSONObject json = new JSONObject();
                    json.put("ap", "app");
                    //cm : 公共日志字段：15个
                    json.put("cm", GenerateFieldsDataUtil.generateComFields());

                    /**
                     * 事件日志字段数据，不同的事件类型字段数据，存放在一个JSON数组中
                     * 1）每一种事件，都代表一个用户在登录一次App的过程中，所访问的不同的页面信息：
                     * 2）在客户端通过JS埋点程序采集用户的事件数据时，不是采集到一个事件数据就直接往后台服务器
                     *      上发送，而是将用户一次访问的所有事件数据全部采集到之后，封装成一条Json数据，再统一往后台服务器发送
                     */
                    JSONArray eventsArray = new JSONArray();
                    /**
                     * 1、商品点击事件字段数据
                     *    事件名称：display
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateDisplay());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 2、商品详情页事件字段数据
                     *     事件名称：newsdetail
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateNewsDetail());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 3、商品列表页事件字段数据
                     *      事件名称：loading
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateNewList());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 4、广告事件字段数据
                     *      事件名称：ad
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateAd());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 5、消息通知
                     *      事件名称：notification
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateNotification());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 6、用户后台活跃
                     *      事件名称：active_background
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateBackground());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 7、错误日志
                     *      事件名称：error
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateError());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 8、用户评论
                     *      事件名称：comment
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateComment());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 9、用户收藏
                     *      事件名称：favorites
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generateFavorites());
                        json.put("et", eventsArray);
                    }
                    /**
                     * 10、用户点赞
                     *      事件名称：praise
                     */
                    if (rand.nextBoolean()) {
                        eventsArray.add(GenerateFieldsDataUtil.generatePraise());
                        json.put("et", eventsArray);
                    }

                    /**
                     * 事件日志数据生成时间(后台服务器接收到前端发送来的数据的时间)：
                     */
                    long millis = System.currentTimeMillis();

                    /**
                     *1. 控制台打印  时间 | 公共字段+事件字段
                     */
                    logger.info(millis + "|" + json.toJSONString());
                    /**
                     * 2. 请求发送到指定webserver:
                     */
                    //RequestProcess.sendLogByAsynchronousRequest(millis + "|" + json.toJSONString());
                    break;
            }

            // 每条日志数据生成时延迟的时间
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        //args = new String[]{"0" , "1000"};
        // 参数一：控制发送每条的延时时间，默认是0
        Long delay = args.length > 0 ? Long.parseLong(args[0]) : 0L;
        // 参数二：循环遍历次数
        int loop_len = args.length > 1 ? Integer.parseInt(args[1]) : 1000;
        // 生成数据
        generateLog(delay, loop_len);
    }
}
